home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 January / CHIP Turkiye Ocak 1998.iso / ARACLAR / LOTUSORG / ACROREAD / INSTALL.DSK / SHARE32.LSS < prev    next >
Text File  |  1996-05-20  |  69KB  |  1,812 lines

  1. ''   Module Name:    share32.lss
  2. ''
  3. ''   Module Code:    TOOLKIT
  4. ''
  5. ''   Author:         MZ              
  6. ''
  7. ''   Creation Date:  Apr 12, 1995
  8. ''
  9. ''   Copyright Lotus Development Corporation, (c) 1991
  10. ''
  11. ''
  12. ''  
  13. ''   Description: 
  14. ''     Lotus script file for common install
  15. ''  
  16. ''
  17. ''   Additional authors:
  18. ''
  19. ''   Change History:
  20. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/share32@.lss  $
  21. '' 
  22. ''    Rev 1.88   20 May 1996 14:33:02   jdonohue
  23. '' Only copy shared components to node if on server AND in copy list
  24. '' 
  25. ''    Rev 1.87   17 May 1996 12:03:12   jdonohue
  26. '' Ref SPR: RWIS35JHBH
  27. '' Added backslash to Chart "Style Directory" key and Spell "Data Path"
  28. '' Added backslash for HLM\S\L\C\LocalPath, Network Path and HCU\S\L\C\User Path
  29. '' 
  30. ''    Rev 1.86   15 May 1996 11:29:38   jdonohue
  31. '' Added special processing for Thesaurus data path registry key
  32. '' Changed filename "LTCHEN20.DLL" to "LTCHEN21.DLL"
  33. '' 
  34. ''    Rev 1.85   07 May 1996 16:07:54   jdonohue
  35. '' Ref SPR:    CDWT34YRNF
  36. '' Fixed error with LOTUSUSERDIR source not being set if not in cinstall.ini
  37. '' 
  38. ''    Rev 1.84   02 May 1996 17:02:28   jdonohue
  39. '' Added uninstall object for System Services registry hive created
  40. '' Fixed filename LTSIN31.DLL (was LTSIN30.DLL)
  41. '' 
  42. ''    Rev 1.83   12 Apr 1996 15:43:06   jdonohue
  43. '' Ref SPR:  LSCR34KT6H
  44. '' Added Append argument to Lot_CreateAndRegisterUserSubdir and Lot_CreateUserRegistryEntry 
  45. '' which if true will first check for an existing registry entry, and if value
  46. '' not found in semi-colon delimited list, will add it
  47. '' 
  48. ''    Rev 1.82   01 Apr 1996 13:20:08   jdonohue
  49. '' Fixed error in setting COMPONENTSDIR -- extra backslash
  50. '' 
  51. ''    Rev 1.81   28 Mar 1996 10:20:26   jdonohue
  52. '' Ref SPR: MAS33WPUU
  53. '' Added System Services value ADPT=LTLRN31.DLL
  54. '' Changed System Services version to 3.1 
  55. '' 
  56. ''    Rev 1.80   25 Mar 1996 12:47:58   jdonohue
  57. '' Ref SPR: SBRR33SSBY 
  58. '' Test DoesDirExist not FALSE, since its return value is not equal to script TRUE
  59. '' 
  60. ''    Rev 1.79   12 Mar 1996 16:06:54   jdonohue
  61. '' Added function Lot_CreateUserRegistryEntry
  62. '' Don't write HLM "LocalPath" for node
  63. '' Removed obsolete function Lot_WriteKey
  64. '' 
  65. ''    Rev 1.78   07 Mar 1996 11:30:34   jdonohue
  66. '' Set SYM_EXISTINGLOCALPATH$ based on HCU "Local Path" value for node to support
  67. '' multi-user configurations
  68. '' 
  69. ''    Rev 1.77   04 Mar 1996 08:32:02   jdonohue
  70. '' Remove 16 bit shared component support -- pass 1 : eliminate LOTUSAPP
  71. '' 
  72. ''    Rev 1.76   26 Jan 1996 13:40:18   cmoy
  73. '' HISHI: Merged FE changes
  74. '' 
  75. ''    Rev 1.75   25 Jan 1996 16:41:00   jdonohue
  76. '' Make entries for shared components for Suite so that Suite uninstall will not
  77. '' complain about unknown shared components
  78. '' 
  79. ''    Rev 1.74   22 Dec 1995 10:13:40   jdonohue
  80. '' Removed all references to SYM_PARENTDIR$ -- is now SYM_BASEDIR$ for all
  81. '' 
  82. ''    Rev 1.73   14 Dec 1995 13:22:40   jdonohue
  83. '' Ref SPR: THAY2XTUPX
  84. '' Added new sub Lot_CreateAndRegisterUserSubdir that creates registry entry for
  85. '' user path in HCU and creates the directory if it does not exist
  86. '' 
  87. ''    Rev 1.72   12 Dec 1995 12:58:50   glutz
  88. '' In InitSHARE32(), replaced IsDriveMapped() with DoesDirExist() when
  89. '' checking existing local path.  SPR# RMOO2XDRJY
  90. '' 
  91. ''    Rev 1.71   08 Nov 1995 17:02:50   tveerapp
  92. '' mariana's fix
  93. '' 
  94. ''    Rev 1.70   Oct 24 1995 16:56:20   cmoy
  95. '' removed eof char
  96. '' 
  97. ''    Rev 1.69   13 Oct 1995 14:42:24   jdonohue
  98. '' Added function Lot_RefreshLocalComponentDir that performs this resetting
  99. '' source directory for sections using symbols COMPONENTSDIR and LOTUSUSERDIR fo
  100. '' node installs
  101. '' 
  102. ''    Rev 1.68   10 Oct 1995 15:27:32   jdonohue
  103. '' Deleted registration of shared components for single product (SPR KHAN2WQMU4)
  104. '' 
  105. ''    Rev 1.67   03 Oct 1995 15:06:50   jdonohue
  106. '' For node, register the help registry entry under the first product
  107. '' 
  108. ''    Rev 1.66   02 Oct 1995 17:22:36   tveerapp
  109. '' Fixed spr for Spell Data path to include spell subdirectory.
  110. '' 
  111. ''    Rev 1.65   29 Sep 1995 14:53:44   tveerapp
  112. '' Fixed Spr#TBAT2WFLYM. If lotus Script or Chart is Installed, SystemServices
  113. '' key is written.
  114. '' 
  115. ''    Rev 1.64   29 Sep 1995 12:05:50   jdonohue
  116. '' Do not write shared component information in cinst???.ini if name or version
  117. '' blank
  118. '' 
  119. ''    Rev 1.63   29 Sep 1995 10:09:28   jdonohue
  120. '' Replace cinstall.ini corrupt message with "Drive not available" message if
  121. '' drive not mapped or UNC path invalid
  122. '' 
  123. ''    Rev 1.62   28 Sep 1995 13:35:32   jdonohue
  124. '' Don't use registry entry for validating existing network path for node
  125. '' 
  126. ''    Rev 1.61   25 Sep 1995 17:21:46   tveerapp
  127. '' Uncommented the changes I had commented out for testing.
  128. '' 
  129. ''    Rev 1.60   25 Sep 1995 15:23:00   tveerapp
  130. '' Fixed Spr# TBAT2VZL3X.  Spell registry entries. Also added code to write
  131. '' to HCU userpath in Lot_WriteLocalNetwork.
  132. '' 
  133. ''    Rev 1.59   25 Sep 1995 10:21:50   tveerapp
  134. '' Fixed spr#DCRP2W7PD7. Lot_WriteLocalNetCompPath was incorrectly writing
  135. '' out NetCompPath for standalone(which is not needed) and registering it for
  136. '' uninstall.
  137. '' 
  138. ''    Rev 1.58   Sep 25 1995 09:53:30   cmoy
  139. '' Added function Lot_RegisterHelpFile to add help files to registry and create
  140. '' entry in cinstall.ini for uninstall. Set value of symbol LOTUSUSERDIR to 
  141. '' point to components directory. Do not write dependencies to registry for NODE
  142. '' install
  143. '' 
  144. ''    Rev 1.57   22 Sep 1995 14:53:26   tveerapp
  145. '' Fixed the typ in SytemServices key.Spr#DCRP2WBJSE
  146. '' 
  147. ''    Rev 1.56   21 Sep 1995 18:12:26   tveerapp
  148. '' Fixed spr# TLAN2W7JNX. Registry entries for  Mobil Player.
  149. '' 
  150. ''    Rev 1.55   19 Sep 1995 17:39:20   tveerapp
  151. '' Added special registry processing for Chart in Lot_WriteShare32Registry().
  152. '' 
  153. ''    Rev 1.54   15 Sep 1995 16:55:02   amontalv
  154. '' Check for UNC path before changing drive.
  155. '' 
  156. ''    Rev 1.53   13 Sep 1995 17:46:06   jdonohue
  157. '' Use top section of first product to register directories for uninstall
  158. '' 
  159. ''    Rev 1.52   13 Sep 1995 16:05:24   jdonohue
  160. '' IsDriveMapped returns true only for fixed or remote drive that exists
  161. '' 
  162. ''    Rev 1.51   12 Sep 1995 11:00:24   tveerapp
  163. '' Changes in Lot_Write32Registry for writing to cinstnod.ini for a node install
  164. '' 
  165. ''    Rev 1.50   12 Sep 1995 10:34:52   jdonohue
  166. '' Create local and network component path if they don't exist, and register 
  167. '' them as objects for uninstall
  168. '' 
  169. ''    Rev 1.49   11 Sep 1995 15:58:50   jdonohue
  170. '' IsDriveMapped checks for UNC volumes that directory exists
  171. '' 
  172. ''    Rev 1.48   09 Sep 1995 16:43:24   tveerapp
  173. '' Fixed the suite node problem. Set the SYM_NETCOMPONENT symbol if a clean 
  174. '' path is found with the currently mapped drive.
  175. '' 
  176. ''    Rev 1.47   06 Sep 1995 09:22:30   tveerapp
  177. '' Fixed the suite node install problem.
  178. '' 
  179. ''    Rev 1.46   01 Sep 1995 15:14:00   jdonohue
  180. '' Resourced string for drive not mapped error
  181. '' 
  182. ''    Rev 1.45   01 Sep 1995 12:18:34   jdonohue
  183. '' Don't register HLM\lotus\prod\ver\Components\comp\ver for suite
  184. '' 
  185. ''    Rev 1.44   31 Aug 1995 11:44:34   jdonohue
  186. '' Added function IsDriveMapped to determine if drive letter is mapped and 
  187. '' available
  188. '' Only exit for non-available NetWorkPath if NODE install
  189. '' 
  190. ''    Rev 1.43   29 Aug 1995 10:52:18   jdonohue
  191. '' Check all drives for validating SYM_COMPONENTSDIR$
  192. '' 
  193. ''    Rev 1.42   28 Aug 1995 16:14:54   jdonohue
  194. '' Change help file procesing logic
  195. '' Popup message if shared component drive not mapped and exit
  196. '' 
  197. ''    Rev 1.42   28 Aug 1995 13:31:08   jdonohue
  198. '' Change help file procesing logic
  199. '' Popup message if shared component drive not mapped and exit
  200. '' 
  201. ''    Rev 1.40   25 Aug 1995 17:04:48   jdonohue
  202. '' Added support for node help file registration
  203. '' 
  204. ''    Rev 1.39   25 Aug 1995 16:04:04   jdonohue
  205. '' Take out print for failure to find destination path -- could happen for node
  206. '' 
  207. ''    Rev 1.38   24 Aug 1995 15:58:14   jdonohue
  208. '' Added help file registration to shared component processing
  209. '' 
  210. ''    Rev 1.35   23 Aug 1995 08:15:58   jdonohue
  211. '' Added helpfilename to shared database, read filename for language from 
  212. '' shared.ini
  213. '' 
  214. ''    Rev 1.34   21 Aug 1995 15:41:06   amontalv
  215. '' Put name of registry keys into globals.lss
  216. '' 
  217. ''    Rev 1.33   21 Aug 1995 15:15:54   jdonohue
  218. '' Consolidated share section building for different types
  219. '' 
  220. ''    Rev 1.32   16 Aug 1995 20:33:34   amontalv
  221. '' Added code to do error messages for registry.
  222. '' 
  223. ''    Rev 1.31   14 Aug 1995 15:08:36   tveerapp
  224. '' Removed the win.ini entry for teammail because the vim-over mapi has gone
  225. '' away.
  226. '' 
  227. ''    Rev 1.30   11 Aug 1995 09:31:54   jdonohue
  228. '' Don't write DLL name for component
  229. '' 
  230. ''    Rev 1.29   01 Aug 1995 14:54:20   jdonohue
  231. '' Removed extraneous set of quotes on version string
  232. '' 
  233. ''    Rev 1.28   24 Jul 1995 09:24:58   jdonohue
  234. '' Increment length for traling null in call to Lot_CreateRegKeyValueEx
  235. '' 
  236. ''    Rev 1.27   18 Jul 1995 11:08:00   jdonohue
  237. '' Make the shared component entry for the product/version
  238. '' 
  239. ''    Rev 1.26   17 Jul 1995 17:28:02   tveerapp
  240. '' Added code to Lot_WriteShare32registry to write into the win.ini for 
  241. '' TeamMail.
  242. '' 
  243. ''    Rev 1.25   17 Jul 1995 16:50:14   amontalv
  244. '' Changed code for registering dialog editor.
  245. '' 
  246. ''    Rev 1.24   17 Jul 1995 16:41:14   amontalv
  247. '' Added registration for dlg editor
  248. '' 
  249. ''    Rev 1.23   17 Jul 1995 15:36:24   amontalv
  250. '' Added Lot_AddLinkToFolder to add Dialog Editor in correct location.
  251. '' 
  252. ''    Rev 1.22   20 Jun 1995 17:42:50   mzgripce
  253. '' use trimendslash before calling the createregkeyval
  254. '' 
  255. ''    Rev 1.21   19 Jun 1995 19:10:40   mzgripce
  256. '' do the share32 operations only if share32 are supported 
  257. '' 
  258. ''    Rev 1.20   16 Jun 1995 15:34:50   cmoy
  259. '' mariana fixed registration for flw build
  260. '' 
  261. ''    Rev 1.19   15 Jun 1995 18:08:54   mzgripce
  262. '' attempt to fix local/network Path in Win95 registry
  263. '' 
  264. ''    Rev 1.18   12 Jun 1995 18:14:46   mzgripce
  265. '' populate the inifilename
  266. '' 
  267. ''    Rev 1.17   12 Jun 1995 18:05:26   mzgripce
  268. '' added fileininame and fix Dependents writing when tere are no dependents
  269. '' 
  270. ''    Rev 1.16   08 Jun 1995 17:04:00   mzgripce
  271. '' write WIN32 Shared Component Information in cinstall.ini for uninstall
  272. '' 
  273. ''    Rev 1.15   07 Jun 1995 18:56:16   mzgripce
  274. '' register the dependents for the components 
  275. '' 
  276. ''    Rev 1.14   07 Jun 1995 17:38:10   tveerapp
  277. '' For suite server install get the componentsdir value from response file
  278. '' for automation. The change is in InitShare32.
  279. '' 
  280. ''    Rev 1.13   07 Jun 1995 16:33:32   mzgripce
  281. '' fix the registry after the new script integration 
  282. '' 
  283. ''    Rev 1.12   06 Jun 1995 17:30:12   tveerapp
  284. '' ADDED check for single product server install in InitShare32.
  285. '' 
  286. ''    Rev 1.11   06 Jun 1995 16:44:44   tveerapp
  287. '' Added Code to InitShare32 to read in the COMPONENTSDIR from the
  288. '' response file for a single products server install (automated).
  289. '' 
  290. ''    Rev 1.10   06 Jun 1995 15:59:12   amontalv
  291. '' We are experiencing problems with LotusScript when we fill buffers with
  292. '' nulls and then pass them to C routines.  For the time being, it is suggested
  293. '' that we fill our buffers with spaces.  To this end (and to make it
  294. '' easier to change back later) I have created a small LotusScript routine
  295. '' named CreateBuffer.  You use it any time you ordinarily would use
  296. '' STRING$(num, 0).  CreateBuffer() just needs the num, it decides what to
  297. '' fill the buffer with (sorry about the grammer).  Right now it fill the
  298. '' buffer with spaces.  Later we will change it back to nulls.  Also look
  299. '' at the routine NullTrim().  It will get rid of final nulls and spaces.
  300. '' You can use this when getting a buffer that has been changed or filled
  301. '' in a external C routine.
  302. '' 
  303. ''    Rev 1.9   05 Jun 1995 18:03:08   tveerapp
  304. '' Modified InitShare32. Removed the check foe automated install.
  305. '' Initshare32 does the same processing for all kinds of
  306. '' install.
  307. '' 
  308. ''    Rev 1.8   04 Jun 1995 16:32:14   mzgripce
  309. '' debig populate and write to the registry 
  310. '' 
  311. ''    Rev 1.7   01 Jun 1995 15:40:50   mzgripce
  312. '' enable the registry calls and populate the datadriver struc
  313. '' 
  314. ''    Rev 1.6   22 May 1995 19:16:02   mzgripce
  315. '' read from the registry if the components directory already exists 
  316. '' 
  317. ''    Rev 1.5   21 May 1995 17:25:52   mzgripce
  318. '' set the component default value differently 
  319. '' 
  320. ''    Rev 1.4   16 May 1995 17:09:00   glutz
  321. '' Changed USE to AUTOMATE
  322. '' 
  323. ''    Rev 1.3   13 May 1995 16:59:44   mzgripce
  324. '' added Lot_Save32ShareConfig... function and Populate32SharedData subroutine
  325. '' 
  326. ''    Rev 1.2   03 May 1995 18:16:14   mzgripce
  327. '' move some functions from share.lss and debug the syntax errors 
  328. '' 
  329. ''    Rev 1.1   17 Apr 1995 16:47:38   mzgripce
  330. '' add more functionality
  331. '' 
  332. ''    Rev 1.0   13 Apr 1995 11:23:46   mzgripce
  333. '' Initial Revision
  334. '' 
  335. ''    Rev 1.0   13 Apr 1995 11:00:02   mzgripce
  336. '' Initial Revision
  337. '' 
  338. '' 
  339. ''----------------------------------------------------------------------
  340. USE "AUTOMATE"
  341. OPTION DECLARE
  342.  
  343. 'Global variables
  344. PUBLIC gLotusIniPath AS STRING
  345. PUBLIC gLotusappIniPath AS STRING
  346. PUBLIC gLotusBcfDir AS STRING
  347. PUBLIC gLotusappDir AS STRING
  348. PUBLIC g32DataLensInstalled AS INTEGER
  349.  
  350. 'Global Functions
  351. DECLARE PUBLIC FUNCTION InitSHARE32 () AS INTEGER
  352. DECLARE PUBLIC FUNCTION ConfigSHARE32 () AS INTEGER
  353. DECLARE PUBLIC FUNCTION AddSHARE32Icons () AS INTEGER
  354. DECLARE PUBLIC FUNCTION Lot_LocalGetPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  355. DECLARE PUBLIC FUNCTION Lot_GetLotusiniPath (s$) AS INTEGER
  356. DECLARE PUBLIC FUNCTION Lot_GetSharedIniPathName() AS STRING
  357. DECLARE PUBLIC FUNCTION Lot_GetLotusappiniPath (s1$, s2$,s3$) AS INTEGER
  358. DECLARE PUBLIC FUNCTION IsDriveMapped(szPath$) AS INTEGER
  359. DECLARE PUBLIC SUB Lot_RegisterHelpFile(szKey$, szDir$, FileName$)
  360. DECLARE PUBLIC FUNCTION Lot_RefreshLocalComponentDir () AS INTEGER
  361.  
  362.  
  363. 'Local Functions
  364. DECLARE FUNCTION Lot_GetAllShared32Installed () AS INTEGER
  365. DECLARE FUNCTION Lot_WriteRegistryLocalNetworkPath() AS INTEGER
  366. DECLARE FUNCTION Lot_Save32ShareConfigInInstallIni() AS INTEGER
  367. DECLARE SUB Populate32SHAREDDATA
  368. DECLARE SUB Lot_WriteShare32InTheRegistry
  369. DECLARE SUB PopupMappingErrorMsgExit(szPath$)
  370. DECLARE SUB Lot_CreateAndRegisterUserSubdir(szSubKey$, szValueName$, LocCompPath$, bAppend%)
  371. DECLARE SUB Lot_CreateUserRegistryEntry(szSubKey$, szValueName$, Value$, bAppend%)
  372.  
  373.  
  374. 'Data Structure
  375.  
  376. '******************** Win 32 Shared features data driver *********
  377. TYPE WIN32SHARED
  378.    SharedIniWin32SecName      AS STRING
  379.    Win32ComponentName         AS STRING
  380.    ListOfFilesInWin32Section  AS STRING    'List
  381.    DestSubdir                 AS STRING
  382.    INFSharedKey               AS STRING
  383.    ListOfINFSectionKeywords   AS STRING    'List
  384.    IniFileName                AS STRING
  385.    IniSectionName             AS STRING
  386.    IniEntryName               AS STRING
  387.    KeyFileName                AS STRING
  388.    HelpFileNames              AS STRING    'List
  389.    RegistrationKey            AS STRING    
  390.    Version                    AS STRING
  391.    ListOfDependsOnNames       AS STRING
  392.    ListOfDependsOnVers        AS STRING
  393. END TYPE
  394.  
  395. DIM Shared32Data(gMaxNumOfSharedKeywords) AS WIN32SHARED
  396. DIM Shared32DataCount AS INTEGER        'The current number of structs
  397.  
  398.  
  399. DIM SectTypeList LIST AS STRING
  400. SUB Initialize
  401.     SectTypeList(1) = "Program"
  402.     SectTypeList(2) = "User"
  403.     SectTypeList(3) = "Data"
  404.     SectTypeList(4) = "Filters"
  405. END SUB
  406.  
  407. PUBLIC FUNCTION InitSHARE32 () AS INTEGER
  408. '** Purpose:    Initialize COMPONENTSDIR$ destination
  409. '**             symbols 
  410. '**             and for automated install 
  411. '**              sets SYM_AUTO_COMPONENTSDIR$
  412. '** Author:     MZ                             
  413. '** Arguments:  None
  414. '** Returns:    SUCCESS
  415. '*************************************************************************
  416.    DIM componentsDir$, possibleDrv$
  417.    DIM availSpace&, network$, cwd$, gInstallIniFile$, rc%, netComponent$
  418.    DIM netComponentIni$, keyvalue$
  419.    DIM rv%, notused%, SameFlag$
  420.    DIM source$, FLWPath$, drive$, RCDialog$, AutoLotusapp$
  421.    DIM KeyHandle&, RegKeyReturn&,AutoComponents$,CompPathLen&
  422.    DIM ExistingLocalPath$, ExistingNetworkPath$
  423.  
  424.    CompPathLen&=CLNG(1024)
  425.    ExistingLocalPath$ = CreateBuffer(1024)
  426.    ExistingNetworkPath$ = CreateBuffer(1024)
  427.    'print "ExistingLocalPath$" ,ExistingLocalPath$
  428.    'print "CompPathLen&",CompPathLen&
  429.   
  430.    '** Execute the rest only if there is a registered product that supports 
  431.    '** share32; Prods(i%)Share32=1
  432.     InitSHARE32 = SUCCESS
  433.    IF Lot_AreShare32ToolsSupported() <> 1 THEN EXIT FUNCTION
  434.  
  435.     network$ = GetSymbolValue(SYM_NETWORK$)
  436.  
  437.     'Get the local and network paths from the registry if they exist
  438.     '***************************************************************
  439.     '** Standard takes its value from HLM\SOFTWARE\Lotus\components\LocalPath
  440.     '** Node takes its value from HCU\SOFTWARE\Lotus\components\User Path
  441.     SELECT CASE network$
  442.    CASE gSTANDARD$ 
  443.      keyvalue$ = "LocalPath"
  444.      RegKeyReturn& =  Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE, gREGLOTUSCOMP, keyvalue$, 0, _
  445.             ExistingLocalPath$, CompPathLen&)
  446.    CASE gNODE$ 
  447.      keyvalue$ = "User Path"
  448.      RegKeyReturn& =  Lot_GetRegKeyValueEx(HKEY_CURRENT_USER, gREGLOTUSCOMP, keyvalue$, 0, _
  449.             ExistingLocalPath$, CompPathLen&)
  450.     END SELECT 
  451.     'print "afer calling Lot_GetRegKeyValueExRegKeyReturn&,",RegKeyReturn&
  452.     ExistingLocalPath$=NullTrim(ExistingLocalPath$)
  453.     ExistingLocalPath$ = Lot_TrimEndSlash(ExistingLocalPath$)
  454.     'print "ExistingLocalPath$,CompPathLen&  **"+ExistingLocalPath$+"**",CompPathLen&
  455.     IF RegKeyReturn& = ERROR_SUCCESS AND _
  456.       DoesDirExist(ExistingLocalPath$) <> FALSE THEN
  457.         SetSymbolValue SYM_EXISTINGLOCALPATH$, ExistingLocalPath$+"\"
  458.     ELSE
  459.         ExistingLocalPath$ = ""
  460.     END IF
  461.  
  462.     'print "before calling Lot_GetRegKeyValueEx"
  463.     RegKeyReturn& = Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  464.         gREGLOTUSCOMP,_
  465.         "NetworkPath",REG_SZ, _
  466.         ExistingNetworkPath$, _
  467.         CompPathLen&)
  468.     'print "afer calling Lot_GetRegKeyValueExRegKeyReturn&,",RegKeyReturn&
  469.     IF RegKeyReturn& = ERROR_SUCCESS THEN
  470.         ExistingNetworkPath$=NullTrim(ExistingNetworkPath$)
  471.         ExistingNetworkPath$= Lot_TrimEndSlash(ExistingNetworkPath$)+"\"
  472.         'print ExistingNetworkPath$,"ExistingNetworkPath$ share32.lss"
  473.         SetSymbolValue SYM_EXISTINGNETPATH$, ExistingNetworkPath$
  474.     ELSE
  475.         SetSymbolValue SYM_EXISTINGNETPATH$, ""
  476.     END IF
  477.  
  478.     'Built the default components directory location
  479.     '************************************************
  480.     '    IN Standalone OR node single product
  481.     '       preexisting one  OR
  482.     '       ParentDir+gCOMPONENET
  483.     '    IN Standalone OR node suite
  484.     '       preexisting one  OR
  485.     '       BaseDir+gCOMPONENET
  486.     '    IN Server single product
  487.     '       ParentDir+gCOMPONENET
  488.     '    IN Server suite
  489.     '       BaseDir+gCOMPONENET
  490.     '    IN Distribution single product OR suite
  491.     '       Do not set components directory
  492.     'print "building the default components dir; ExistingLocalPath$=",ExistingLocalPath$
  493.  
  494.     IF ExistingLocalPath$ <> "" THEN
  495.         IF (network$ = gSTANDARD$ OR network$ = gNODE$) THEN
  496.             'print "in standard or node with preexisting compDir"
  497.             componentsDir$ = LCASE$(ExistingLocalPath$)+"\"
  498.         ELSEIF network$ = gSERVER$ THEN
  499.             componentsDir$ = GetSymbolValue(SYM_BASEDIR)+gCOMPONENTS$+"\"
  500.         END IF
  501.     ELSE   'if no preexisting local component
  502.         'print " no preexisting comp dir"
  503.         componentsDir$ = GetSymbolValue(SYM_BASEDIR)+gCOMPONENTS$+"\"
  504.     END IF
  505.     IF ExistingLocalPath$ = "" OR network$ <> gDISTRIBUTION$ THEN
  506.         SetSymbolValue SYM_COMPONENTSDIR$,componentsDir$
  507.         'print "componentsDir$ in INITShare32", componentsDir$
  508.     END IF
  509.  
  510.     'print "GetSymbolValue(SYM_COMPONENTSDIR$)=", GetSymbolValue(SYM_COMPONENTSDIR$)
  511.     'Set the name of the component dir
  512.     SetSymbolValue SYM_COMPONENTSDIR$+gNAME$, LdString(SID_SHARED_LOTUS_TOOLS)
  513.     'print "2"   
  514.  
  515.     '*** AUTOMATION: single product & suite server install get compnent dir from
  516.     '*** response file.
  517.     IF GetSymbolValue (SYM_AUTOMATIONINST$) = gTRUE$ AND _
  518.         network$ = gSERVER$   THEN
  519.         componentsDir$ = Lot_GetKeyValFromResponseFile("Shared Components","COMPONENTSDIR")
  520.         IF RIGHT$(componentsDir$, 1) <> "\" THEN
  521.             componentsDir$ = componentsDir$+ "\"
  522.         END IF
  523.         IF ValidatePath (componentsDir$) <> FALSE THEN
  524.             SetSymbolValue SYM_COMPONENTSDIR$,componentsDir$
  525.             'print "in automation"                            
  526.         ELSE
  527.             ErrorMsg SID_ERR_AUTO_INSTALL, LdString (SID_ERR_AUTO_COMPNENTSDIR)
  528.             ERROR STFQUIT
  529.         END IF
  530.     END IF
  531.       
  532.     'Set NETCOMPONENT symbol
  533.     '***********************
  534.     IF network$ = gNODE$ THEN
  535.         'Get the current working directory
  536.         cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  537.         source$ = GetSymbolValue(SYM_STF_SRCDIR$)
  538.         gInstallIniFile$ = cwd$+gINSTALLINI$
  539.         rc% = DoesFileExist(gInstallIniFile$,femExists)
  540.         IF rc% = 1 THEN
  541.             netComponentIni$ = GetIniKeyString(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$)
  542.            netComponent$ = Lot_LocalGetPathFromIni(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$,NULLSTROK,INVALIDSTROK)
  543.            'print netComponent$,"netComponent$ in share32.lss"
  544.            SameFlag$ = GetIniKeyString(gInstallIniFile$, _
  545.                "Server Configuration of Shared Tools", _
  546.                "SameDriveForComponent")
  547.            'print SameFlag$,"SameFlag$"
  548.            IF netComponent$ = "" THEN
  549.                    '** TV: netComponent comes back empty (win32) beacuse FValidPath fails
  550.             '** if the drive does not exist    
  551.                   rv% = 0
  552.                          IF SameFlag$ = "1" THEN
  553.                      netComponent$ = GetIniKeyString(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$)
  554.                      IF netComponent$ <> "" AND NOT Lot_IsUnvalidatedUNCPath(netComponent$) THEN
  555.                         Lot_SplitAnyPath netComponent$, possibleDrv$, componentsDir$
  556.                         netComponent$ = Lot_GetVol(source$)+componentsDir$
  557.                       rv% = Lot_CleanPath(netComponent$)
  558.                      END IF
  559.                    END IF
  560.                       IF rv% = 0 THEN
  561.                   'print "0", gInstallIniFile$
  562.                '   ErrorMsg SID_ERR_INSTALLINI_CORRUPT, CHR$(10) + CHR$(10)+netComponent$
  563.                'gEndStatementEncountered% = TRUE
  564.                 PopupMappingErrorMsgExit(netComponentIni$)
  565.                EXIT FUNCTION
  566.                'FatalErrorMsg SID_ERR_INSTALLINI_CORRUPT, netComponent$, STFQUIT
  567.              ELSE
  568.                SetSymbolValue SYM_NETCOMPONENT$, netComponent$
  569.                  END IF
  570.               ELSE
  571.             IF SameFlag$ = "1" AND NOT Lot_IsUnvalidatedUNCPath(netComponent$) THEN
  572.                 Lot_SplitAnyPath netComponent$, possibleDrv$, componentsDir$
  573.                 SetSymbolValue SYM_NETCOMPONENT$, Lot_GetVol(source$)+componentsDir$
  574.             ELSE
  575.                 SetSymbolValue SYM_NETCOMPONENT$, netComponent$
  576.             END IF
  577.            END IF
  578.  
  579.              ELSE
  580.             'print "1", gInstallIniFile$
  581.             ErrorMsg SID_ERR_INSTALLINI_MISSING, CHR$(10) + CHR$(10)+gInstallIniFile$
  582.                 gEndStatementEncountered% = TRUE
  583.                 EXIT FUNCTION
  584.                'FatalErrorMsg SID_ERR_INSTALLINI_MISSING, gInstallIniFile$, STFQUIT
  585.         END IF
  586.  
  587.     END IF
  588.  
  589.     '*** Should compare SYM_EXISTINGNETPATH$ and SYM_NETCOMPONENT$ at this point
  590.     '*** and tell the user that a previous node install will not be valid if they 
  591.     '*** choose to continue with dialog YES/EXIT INSTALL
  592.     '!! JMD@
  593.  
  594.     'Initialize global gLotusIniPath$
  595.     gLotusIniPath$ = CreateBuffer$(256)
  596.     notused% = Lot_GetLotusiniPath(gLotusIniPath$)
  597.     'print gLotusIniPath$,"gLotusIniPath$"
  598.  
  599.     gLotusappIniPath$=CreateBuffer(256)
  600.     gLotusBcfDir$=CreateBuffer(256)
  601.  
  602.   'print"4"   
  603.   'print GetSymbolValue(SYM_COMPONENTSDIR$)
  604.     'For now, the local user directory is the local components directory,
  605.     'c:\lotus\compnent, e.g.
  606.     SetSymbolValue SYM_LOTUSUSERDIR$, GetSymbolValue(SYM_COMPONENTSDIR$)
  607. END FUNCTION
  608. '*************************************************************************
  609.  
  610.  
  611. PUBLIC FUNCTION ConfigSHARE32 () AS INTEGER
  612. '** Purpose:    Read the copy list and depending on the Shared tools 
  613. '**             installed update lotus.ini and lotusapp.ini
  614. '** Author:     MZ
  615. '** Arguments:  None
  616. '** Returns:    SUCCESS
  617. '*************************************************************************
  618.    DIM NetworkIns$, notused%
  619.  
  620.    ' this will be replaced with Populate... and WriteShare32...
  621. '   notused% = Lot_GetAllShared32Installed()
  622.  
  623.    notused% = Lot_GetLotusappiniPath(gLotusappIniPath, gLotusappDir, gLotusBcfDir)
  624.  
  625.    '** Execute the rest only if there is a registered product that supports 
  626.    '** share Prods(i%)Share=1
  627.    IF Lot_AreShare32ToolsSupported()=1 THEN
  628.       'Write the INI files for standard and node install and save the config in server
  629.       NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  630.  
  631.       IF NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gNODE$ THEN
  632.      'print "before calling WriteReg"
  633.       notused% = Lot_WriteRegistryLocalNetworkPath()
  634.       ELSEIF NetworkIns$ = gSERVER$ THEN
  635.       'Save the server configuration in the install.ini (to be used by the node install)
  636.       notused% = Lot_Save32ShareConfigInInstallIni()
  637.       END IF
  638.       IF Lot_IsTheFeatureInstalled("WIN32SHRDBASEPRG")=1 OR _
  639.      Lot_IsTheFeatureInstalled("WIN32SHRINFORMIXPRG")=1 OR _
  640.      Lot_IsTheFeatureInstalled("WIN32SHRIBMPRG")=1 OR _
  641.      Lot_IsTheFeatureInstalled("WIN32SHRSQLPRG")=1 OR _
  642.      Lot_IsTheFeatureInstalled("WIN32SHRPARADOXPRG")=1 OR _
  643.      Lot_IsTheFeatureInstalled("WIN32SHRNOTESSQLPRG")=1 OR _
  644.      Lot_IsTheFeatureInstalled("WIN32SHRSPREADSHEETPRG")=1 OR _
  645.      Lot_IsTheFeatureInstalled("WIN32SHRIBMDB2PRG")=1 OR _
  646.      Lot_IsTheFeatureInstalled("WIN32SHRDB2SQLDSPRG")=1 OR _
  647.      Lot_IsTheFeatureInstalled("WIN32SHRDB2_SQL400PRG")=1 OR _
  648.      Lot_IsTheFeatureInstalled("WIN32SHRIBM_DDCS_2PRG")=1 OR _
  649.      Lot_IsTheFeatureInstalled("WIN32SHRODBCDRVRPRG")=1 OR _
  650.      Lot_IsTheFeatureInstalled("WIN32SHRODBCWKSPRG")=1 OR _
  651.      Lot_IsTheFeatureInstalled("WIN32SHRODBCTEXTPRG")=1 OR _
  652.      Lot_IsTheFeatureInstalled("WIN32SHRORACLEPRG")=1 OR _
  653.      Lot_IsTheFeatureInstalled("WIN32SHRODBCBTRIEVEPRG")=1 OR _
  654.      Lot_IsTheFeatureInstalled("WIN32SHRODBCFOXBASEPRG")=1 OR _
  655.      Lot_IsTheFeatureInstalled("WIN32SHRODBCACCESSPRG")=1 OR _
  656.      Lot_IsTheFeatureInstalled("WIN32SHRODBCPARADOXPRG")=1 OR _
  657.      Lot_IsTheFeatureInstalled("WIN32SHRODBCDB2PRG")=1 OR _
  658.      Lot_IsTheFeatureInstalled("WIN32SHRODBCORACLEPRG")=1 OR _
  659.      Lot_IsTheFeatureInstalled("WIN32SHRODBCSQLSVRPRG")=1 THEN 
  660.         g32DataLensInstalled = 1
  661.        ELSE
  662.         g32DataLensInstalled = 0
  663.       END IF
  664.  
  665.       'Write lotus.bcf file
  666.       'print STR$(g32DataLensInstalled)
  667.       IF (NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gSERVER$) AND _
  668.      g32DataLensInstalled = 1 THEN
  669. '         notused% = Lot_WriteLotusBcfFile()
  670.       END IF
  671.  
  672.  
  673.       IF (NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gNODE$) AND _
  674.      g32DataLensInstalled = 1 THEN
  675. '         notused% = Lot_WriteODBCINST()
  676.       END IF     
  677.       'Write the Registry
  678.       Lot_WriteShare32InTheRegistry
  679.  
  680.    END IF
  681.  
  682.  
  683. ConfigSHARE32=SUCCESS
  684. END FUNCTION
  685. '*************************************************************************
  686.  
  687. PUBLIC FUNCTION AddSHARE32Icons() AS INTEGER
  688. '** Purpose:   Puts up the shared tools icons
  689. '** Author:    MZ
  690. '** Returns:   1 if success
  691. '***************************************************
  692. DIM grouptitle$,Lotusappdir$,dlgeditor$,Network$, IconName$
  693. DIM Feature$
  694.  
  695.    IF Lot_AreShare32ToolsSupported()=1 THEN
  696.  
  697.      Network$ = GetSymbolValue(SYM_NETWORK$)
  698.      grouptitle$ = Reg_GetProgManagerGroupName(1)
  699.   END IF
  700. AddSHARE32Icons=SUCCESS
  701. END FUNCTION
  702. '*************************************************************************
  703.  
  704.  
  705. FUNCTION Lot_GetAllShared32Installed() AS INTEGER
  706. '** Purpose:    This function searches the copy list and populates the 
  707. '**             RegEntry list with the entries that have to be updated
  708. '**             for standalone install and reades the cinstall.ini for
  709. '**             node install
  710. '** Author:     MZ
  711. '** Arguments:  None
  712. '** Symbols Out:RegEntry
  713. '** Returns:    SUCCESS
  714. '*************************************************************************
  715.    DIM network$,currchpt$,sharedid$
  716.    DIM SectionPref$,SectionNumber%,SectionTag$,SectionName$
  717.    DIM INFSecKeyWordPref$, INFSecKeyWordNum%, INFSecKeyWordTag$, INFSecKeyWordName$
  718.    DIM INFShrKey$,gSharedIniFile$
  719.  
  720.    IF Lot_AreShare32ToolsSupported()=1 THEN
  721.  
  722.      gSharedIniFile$ = Lot_GetSharedIniPathName()
  723.      network$ = GetSymbolValue(SYM_NETWORK$)
  724.      IF network$ = gSTANDARD$ THEN
  725.         'The call to Lot_GetChapterValStr returns a comment when no value is found
  726.  
  727.         CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  728.         WHILE (CurrChpt$ <> "")
  729.        SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  730.               IF SharedID$ <> "" THEN
  731.                  IF MID$(SharedID$,1,5) = "WIN32" THEN
  732.                     INFSecKeyWordName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)   
  733.  
  734.              'print SharedID$,INFSecKeyWordName$,"Add KeyWord"
  735.              AddListItem SYM_REGENTRY$,INFSecKeyWordName$
  736.           END IF
  737.        END IF
  738.        CurrChpt$ = Lot_GetNext() 
  739.         WEND
  740.         Lot_GetAllShared32Installed = SUCCESS
  741.  
  742.         'End of the processing for STANDARD
  743.  
  744.       ELSEIF network$ = gNODE$ THEN
  745.  
  746.         'Initialize the loop
  747.         SectionPref$="Section"
  748.         SectionNumber%=1
  749.         SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  750.         'print "SectionTag$",SectionTag$ 
  751.         'print "gSharedIniFile$ where used",gSharedIniFile$ 
  752.         SectionName$ = GetIniKeyString(gSharedIniFile$,_
  753.                      "Win32 Sections",_ 
  754.                      SectionTag$)
  755.         'print "SectionName$",SectionName$
  756.  
  757.         'Using the shared.ini as a data driver I find all the shared sections installed
  758.         '
  759.         DO
  760.        'Process Program section
  761.        '***********************
  762.        'Process User, Data, and Filter section
  763.        '**************************************
  764.         FORALL SectType IN SectTypeList
  765.         
  766.        INFShrKey$ = GetIniKeyString(gSharedIniFile$,_
  767.                      SectionName$+" "+SectType,_
  768.                      "INFSharedKey")
  769.        'print INFShrKey$,"INFShrKey$"
  770.        IF INFShrKey$ <> "" THEN
  771.  
  772.           'Initialize the loop
  773.           INFSecKeyWordPref$="INFSectionKeyword"
  774.           INFSecKeyWordNum%=1
  775.           INFSecKeyWordTag$=INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  776.           'print "INFSecKeyWordTag$",INFSecKeyWordTag$ 
  777.           INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  778.                          SectionName$+" "+SectType,_
  779.                          INFSecKeyWordTag$)
  780.           'print "INFSecKeyWordName$",INFSecKeyWordName$
  781.           'print "SectionName$", SectionName$
  782.  
  783.           DO
  784.  
  785.              IF INFSecKeyWordName$ <> "" THEN
  786.             IF Lot_IsTheFeatureInstalled(INFSecKeyWordName$) THEN
  787.                AddListItem SYM_REGENTRY$,INFSecKeyWordName$
  788.             END IF
  789.              END IF
  790.  
  791.              INFSecKeyWordNum%=INFSecKeyWordNum%+1
  792.              INFSecKeyWordTag$=INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  793.              'print "INFSecKeyWordTag$",INFSecKeyWordTag$ 
  794.              INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  795.                             SectionName$+" "+SectType,_
  796.                             INFSecKeyWordTag$)
  797.  
  798.           LOOP UNTIL INFSecKeyWordName$ = ""
  799.        END IF
  800.  
  801.         END FORALL 
  802.  
  803.        SectionNumber%=SectionNumber%+1
  804.        SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  805.        'print "SectionTag$",SectionTag$ 
  806.        'print "gSharedIniFile$ where used",gSharedIniFile$ 
  807.        SectionName$ = GetIniKeyString(gSharedIniFile$, _
  808.                     "Win32 Sections",_ 
  809.                     SectionTag$)
  810.  
  811.          LOOP UNTIL SectionName$ = ""
  812.  
  813.      END IF
  814.  
  815.    END IF
  816.    Lot_GetAllShared32Installed = SUCCESS
  817.  
  818. END FUNCTION
  819.  
  820. '*************************************************************************
  821. FUNCTION Lot_WriteRegistryLocalNetworkPath() AS INTEGER
  822. '** Purpose:    This function writes into the Registry
  823. '**     NOTE: This function should only be called for standard or node install
  824. '** Author:     MZ
  825. '** Arguments:  None
  826. '** Symbols In: SYM_COMPONENTSDIR$,SYM_NETCOMPONENT$
  827. '** Returns:    SUCCESS
  828. '*************************************************************************
  829.    DIM RegEntryListLen%,network$,EntryCount%,Entry$,notused%
  830.    DIM s$, LocCompPath$, NetCompPath$, UserPath$, LReturn&
  831.  
  832.    IF Lot_AreShare32ToolsSupported()=1 THEN
  833.    
  834.       LocCompPath$=GetSymbolValue(SYM_COMPONENTSDIR$)
  835.       NetCompPath$=GetSymbolValue(SYM_NETCOMPONENT$) 
  836.       UserPath$=GetSymbolValue(SYM_LOTUSUSERDIR$)
  837.  
  838.         'Make sure ends in trailing backslash
  839.       LocCompPath$=Lot_TrimEndSlash(LocCompPath$)
  840.       NetCompPath$=Lot_TrimEndSlash(NetCompPath$)
  841.         LocCompPath$= LocCompPath$ + "\"
  842.         NetCompPath$= NetCompPath$ + "\"
  843.  
  844.       '*** TV: HCU user path for Chart,Spell, Filters,etc.
  845.         Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP, "User Path", UserPath$, FALSE
  846.  
  847.       network$ = GetSymbolValue(SYM_NETWORK$)
  848.         'Standard install, write to "LocalPath" in HLM
  849.       IF network$ <> gNODE$ THEN
  850.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  851.                       gREGLOTUSCOMP, "LocalPath", REG_SZ,_
  852.                       LocCompPath$, LENBP(LocCompPath$)+1)
  853.             IF LReturn& <> ERROR_SUCCESS THEN 
  854.                 RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP,"LocalPath",LocCompPath$
  855.             END IF
  856.             'Create the paths if they don't exist
  857.             'and register the directory under the first product for uninstall
  858.             IF DoesDirExist(LocCompPath$) <> TRUE THEN 
  859.                 Lot_CreateDirectory(LocCompPath$) 
  860.                 s$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(1) + gTOP$)
  861.                 s$ = Lot_GetChapterValStr(s$, F_KEYWORD)   
  862.                 Lot_RegisterObject s$, UNIN_CLASS_DIRECTORY$, LocCompPath$
  863.             END IF
  864.       
  865.         ELSE
  866.             'Write NetComponent Path into the registry
  867.          LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  868.                       gREGLOTUSCOMP, "NetworkPath", REG_SZ,_
  869.                       NetCompPath$, LENBP(NetCompPath$)+1)
  870.               IF LReturn& <> ERROR_SUCCESS THEN
  871.                RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP,"NetworkPath",NetCompPath$
  872.               END IF
  873.  
  874.       END IF
  875.  
  876.       'Populate the 32SHAREDATA array of WIN32SHARED structures
  877.       Populate32SHAREDDATA
  878.  
  879.    END IF
  880.  
  881.    Lot_WriteRegistryLocalNetworkPath = SUCCESS
  882. END FUNCTION
  883. '*************************************************************************
  884.  
  885. SUB Populate32SHAREDDATA
  886. '** Purpose:    This subroutine is to populate the 32SHAREDATA array of 
  887. '**             WIN32SHARED structure by reading the data driver shared.ini
  888. '** Author:     MZ
  889. '** Arguments:  None
  890. '** Symbols In: 
  891. '** Returns:    SUCCESS
  892. '*************************************************************************
  893.    DIM network$,currchpt$,sharedid$, rc%
  894.    DIM SectionPref$,SectionNumber%,SectionTag$,SectionName$
  895.    DIM INFSecKeyWordPref$, INFSecKeyWordNum%, INFSecKeyWordTag$
  896.    DIM INFShrKey$,SectionExist%,INFSecKeyWordName$,gSharedIniFile$
  897.    DIM FilePref$,FileNumber%,FileTag$,FileName$,FileList$,KeyWordList$
  898.    DIM HelpFileNumber%
  899.    DIM DependsOnName$,DependsOnNameNum%,DependsOnNameTag$,DependsOnNameList$
  900.    DIM DependsOnVer$,DependsOnVerNum%, DependsOnVerTag$,DependsOnVerList$
  901.    DIM DependsOnNamePref$, DependsOnVerPref$ 
  902.  
  903.    gSharedIniFile$ = Lot_GetSharedIniPathName()
  904.    Shared32DataCount = 1
  905.  
  906.    'print "Shared32DataCount 1", Shared32DataCount
  907.    'print "gSharedIniFile$", gSharedIniFile$
  908.  
  909.    'Initialize the loop
  910.    SectionPref$="Section"
  911.    SectionNumber%=1
  912.    SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  913.    'print "SectionTag$",SectionTag$ 
  914.    'print "gSharedIniFile$ where used",gSharedIniFile$ 
  915.    SectionName$ = GetIniKeyString(gSharedIniFile$,_
  916.                   "Win32 Sections",_ 
  917.                   SectionTag$)
  918.    'print "SectionName$",SectionName$
  919.  
  920.    'Using the shared.ini as a data driver I find all the shared sections installed
  921.    '
  922.    DO
  923.       'Process All Section Types in SectTypeList
  924.       '*****************************************
  925.         FORALL SectType IN SectTypeList
  926.  
  927.       IF DoesIniSectionExist (gSharedIniFile$,SectionName$+" "+SectType) = 1 THEN
  928.       'print "result of the DoesIniSectionExist =",rc%
  929.  
  930.      '***Populate the SharedIniWin32SecName
  931.      Shared32Data(Shared32DataCount).SharedIniWin32SecName=_
  932.                      SectionName$+" "+SectType
  933.     'print Shared32Data(Shared32DataCount).SharedIniWin32SecName,"Shared32Data(Shared32DataCount).SharedIniWin32SecName"
  934.  
  935.      '***Populate the Win32ComponentName
  936.      Shared32Data(Shared32DataCount).Win32ComponentName=_
  937.               GetIniKeyString(gSharedIniFile$,SectionName$+" "+SectType,_
  938.                      "Win32ComponentName")
  939.     'print Shared32Data(Shared32DataCount).Win32ComponentName,"Shared32Data(Shared32DataCount).Win32ComponentName"
  940.  
  941.  
  942.      '***Populate the list ListOfFilesInWin32Section
  943.      'Initialize the loop
  944.      FilePref$ = "file"
  945.      FileNumber% = 1
  946.      FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  947.  
  948.      FileName$ = GetIniKeyString(gSharedIniFile$,_
  949.                      SectionName$+" "+SectType,_
  950.                      FileTag$)
  951.     'print FileName$,"FileName$"
  952.  
  953.      'make the filelist name 
  954.      FileList$ = "FileList"+LTRIM$(STR(Shared32DataCount))
  955.      IF FileName$ <> "" THEN
  956.  
  957.         DO
  958.           
  959.            SetListItem FileList$,  FileNumber%, FileName$
  960.            FileNumber% = FileNumber% + 1
  961.            FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  962.            FileName$ = GetIniKeyString(gSharedIniFile$,_
  963.                      SectionName$+" "+SectType,_
  964.                      FileTag$)
  965.            'print FileName$,"FileName$"
  966.         LOOP UNTIL FileName$ =""
  967.      ELSE
  968.         SetListItem FileList$,  FileNumber%, FileName$
  969.      END IF
  970.  
  971.      'Determine the associated help files for the current language
  972.      FilePref$ = "helpfile"
  973.      FileNumber% = 1
  974.      HelpFileNumber% = 1
  975.      FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  976.      'Save the helpfile names for the current language
  977.      DO
  978.          FileName$ = GetIniKeyString(gSharedIniFile$,_
  979.                              SectionName$+" "+SectType, FileTag$)
  980.         IF Lot_GetNthFieldFromIniString (FileName$, 1, "") = _
  981.                 GetSymbolValue(SYM_INSTALL_LANGUAGE$) THEN
  982.             FileName$ = Lot_GetNthFieldFromIniString (FileName$, 2, "")        
  983.             Shared32Data(Shared32DataCount).HelpFileNames = "HelpFiles"+ _
  984.                 LTRIM$(STR(Shared32DataCount))
  985.             SetListItem Shared32Data(Shared32DataCount).HelpFileNames, _
  986.                 HelpFileNumber%, FileName$
  987.             HelpFileNumber% = HelpFileNumber% + 1
  988.         END IF
  989.         FileNumber% = FileNumber% + 1
  990.         FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  991.      LOOP UNTIL FileName$ =""
  992.  
  993.      '***Populate DestSubdir
  994.      Shared32Data(Shared32DataCount).DestSubdir=_
  995.                      GetIniKeyString(gSharedIniFile$,_
  996.                          SectionName$+" "+SectType,_ 
  997.                          "DestSubdir")
  998.     'print Shared32Data(Shared32DataCount).DestSubdir,"Shared32Data(Shared32DataCount).DestSubdir"
  999.  
  1000.      '***Populate INFSharedKey
  1001.      Shared32Data(Shared32DataCount).INFSharedKey=_
  1002.                      GetIniKeyString(gSharedIniFile$,_
  1003.                          SectionName$+" "+SectType,_ 
  1004.                          "INFSharedKey")
  1005.    
  1006.      '***Populate the list ListOfINFSectionKeywords
  1007.      'Initialize the loop
  1008.      INFSecKeyWordPref$ = "INFSectionKeyword"
  1009.      INFSecKeyWordNum% = 1
  1010.      INFSecKeyWordTag$ = INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  1011.  
  1012.      INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  1013.                      SectionName$+" "+SectType,_
  1014.                      INFSecKeyWordTag$)
  1015.     'print INFSecKeyWordName$,"INFSecKeyWordName$" 
  1016.  
  1017.      'make the KeyWordList name 
  1018.      KeyWordList$ = "KeyWordList"+LTRIM$(STR(Shared32DataCount))
  1019.  
  1020.      IF INFSecKeyWordName$ <> "" THEN
  1021.          DO
  1022.  
  1023.            SetListItem KeyWordList$, INFSecKeyWordNum%, INFSecKeyWordName$
  1024.            INFSecKeyWordNum% = INFSecKeyWordNum% + 1
  1025.            INFSecKeyWordTag$ = INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  1026.            INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  1027.                          SectionName$+" "+SectType,_
  1028.                          INFSecKeyWordTag$)
  1029.            'print INFSecKeyWordName$,"INFSecKeyWordName$" 
  1030.         LOOP UNTIL INFSecKeyWordName$ =""
  1031.      ELSE
  1032.         SetListItem KeyWordList$, INFSecKeyWordNum%, INFSecKeyWordName$
  1033.      END IF
  1034.  
  1035.      '***Populate IniFileName
  1036.      IF SectType = "Program" THEN
  1037.          Shared32Data(Shared32DataCount).IniFileName=_
  1038.                      GetIniKeyString(gSharedIniFile$,_
  1039.                          SectionName$+" "+SectType,_ 
  1040.                          "IniFileName")
  1041.     'print Shared32Data(Shared32DataCount).IniFileName,"Shared32Data(Shared32DataCount).IniFileName" 
  1042.     END IF
  1043.  
  1044.      '***Populate IniSectionName
  1045.      Shared32Data(Shared32DataCount).IniSectionName=_
  1046.                      GetIniKeyString(gSharedIniFile$,_
  1047.                          SectionName$+" "+SectType,_ 
  1048.                          "IniSectionName")
  1049.     'print Shared32Data(Shared32DataCount).IniSectionName,"Shared32Data(Shared32DataCount).IniSectionName" 
  1050.  
  1051.  
  1052.      '***Populate IniEntryName
  1053.      Shared32Data(Shared32DataCount).IniEntryName=_
  1054.                      GetIniKeyString(gSharedIniFile$,_
  1055.                          SectionName$+" "+SectType,_ 
  1056.                          "IniEntry")
  1057.  
  1058.      '***Populate KeyFileName
  1059.      Shared32Data(Shared32DataCount).KeyFileName=_
  1060.                      GetIniKeyString(gSharedIniFile$,_
  1061.                          SectionName$+" "+SectType,_ 
  1062.                          "KeyFileName")
  1063.      'printShared32Data(Shared32DataCount).KeyFileName,"Shared32Data(Shared32DataCount).KeyFileName" 
  1064.  
  1065.  
  1066.      '***Populate the RegistrationKey
  1067.      Shared32Data(Shared32DataCount).RegistrationKey=_
  1068.                      GetIniKeyString(gSharedIniFile$,_
  1069.                          SectionName$+" "+SectType,_ 
  1070.                          "RegistrationKey")
  1071.      'printShared32Data(Shared32DataCount).RegistrationKey,"Shared32Data(Shared32DataCount).RegistrationKey" 
  1072.  
  1073.      '***Populate the Version
  1074.      Shared32Data(Shared32DataCount).Version=_
  1075.                      GetIniKeyString(gSharedIniFile$,_
  1076.                          SectionName$+" "+SectType,_ 
  1077.                          "Version")
  1078.      'printShared32Data(Shared32DataCount).Version,"Shared32Data(Shared32DataCount).Version" 
  1079.  
  1080.      '***Populate the list ListOfDependsOnNames
  1081.      'Initialize the loop
  1082.      DependsOnNamePref$ = "DependsOnName"
  1083.      DependsOnNameNum% = 1
  1084.      DependsOnNameTag$ = DependsOnNamePref$+LTRIM$(STR(DependsOnNameNum%))
  1085.  
  1086.      DependsOnName$ = GetIniKeyString(gSharedIniFile$,_
  1087.                      SectionName$+" "+SectType,_
  1088.                      DependsOnNameTag$)
  1089.      'print DependsOnName$,"DependsOnName$" 
  1090.  
  1091.      'make the DependsOnNameList name 
  1092.      DependsOnNameList$ = "DependsOnNameList"+LTRIM$(STR(Shared32DataCount))
  1093.  
  1094.      IF DependsOnName$ <> "" THEN
  1095.          DO
  1096.  
  1097.            SetListItem DependsOnNameList$, DependsOnNameNum%, DependsOnName$
  1098.            DependsOnNameNum% = DependsOnNameNum% + 1
  1099.            DependsOnNameTag$ = DependsOnNamePref$+LTRIM$(STR(DependsOnNameNum%))
  1100.            DependsOnName$ = GetIniKeyString(gSharedIniFile$,_
  1101.                          SectionName$+" "+SectType,_
  1102.                          DependsOnNameTag$)
  1103.            'print DependsOnName$,"DependsOnName$" 
  1104.         LOOP UNTIL DependsOnName$ =""
  1105.      ELSE
  1106.         SetListItem DependsOnNameList$, DependsOnNameNum%, DependsOnName$
  1107.         'print DependsOnName$,"DependsOnName$ if empty" 
  1108.      END IF
  1109.  
  1110.  
  1111.      '***Populate the list ListOfDependsOnVers
  1112.      'Initialize the loop
  1113.      DependsOnVerPref$ = "DependsOnVer"
  1114.      DependsOnVerNum% = 1
  1115.      DependsOnVerTag$ = DependsOnVerPref$+LTRIM$(STR(DependsOnVerNum%))
  1116.  
  1117.      DependsOnVer$ = GetIniKeyString(gSharedIniFile$,_
  1118.                      SectionName$+" "+SectType,_
  1119.                      DependsOnVerTag$)
  1120.      'print DependsOnVer$,"DependsOnVer$" 
  1121.  
  1122.      'make the DependsOnVerList name 
  1123.      DependsOnVerList$ = "DependsOnVerList"+LTRIM$(STR(Shared32DataCount))
  1124.  
  1125.      IF DependsOnVer$ <> "" THEN
  1126.          DO
  1127.  
  1128.            SetListItem DependsOnVerList$, DependsOnVerNum%, DependsOnVer$
  1129.            DependsOnVerNum% = DependsOnVerNum% + 1
  1130.            DependsOnVerTag$ = DependsOnVerPref$+LTRIM$(STR(DependsOnVerNum%))
  1131.            DependsOnVer$ = GetIniKeyString(gSharedIniFile$,_
  1132.                          SectionName$+" "+SectType,_
  1133.                          DependsOnVerTag$)
  1134.            'print DependsOnVer$,"DependsOnVer$" 
  1135.         LOOP UNTIL DependsOnVer$ =""
  1136.      ELSE
  1137.         SetListItem DependsOnVerList$, DependsOnVerNum%, DependsOnVer$
  1138.         'print DependsOnVer$,"DependsOnVer$ if empty" 
  1139.      END IF
  1140.  
  1141.  
  1142.  
  1143.      Shared32DataCount = Shared32DataCount+1
  1144.      'print Shared32DataCount,"Shared32DataCount 2"
  1145.       END IF ' end of processing all section types
  1146.         
  1147.         END FORALL 
  1148.  
  1149.       SectionNumber%=SectionNumber%+1
  1150.       SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  1151.       'print "SectionTag$",SectionTag$ 
  1152.       'print "gSharedIniFile$ where used",gSharedIniFile$ 
  1153.       SectionName$ = GetIniKeyString(gSharedIniFile$,_
  1154.                      "Win32 Sections",_ 
  1155.                      SectionTag$)     
  1156.       'print "SectionName$",SectionName$ 
  1157.  
  1158.    LOOP UNTIL SectionName$ = ""
  1159.  
  1160.  
  1161. END SUB
  1162.  
  1163.  
  1164. '*************************************************************************
  1165. PUBLIC FUNCTION Lot_LocalGetPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1166. '** Purpose: This function is called whenever we need to retrieve a string
  1167. '**           from .ini file. Function returns a clean path (path returned from
  1168. '**           FCleanFatPath.    
  1169. '** Author:    JKK/MZ
  1170. '** Arguments:  Name of the .ini file, section name in the .ini file, key we
  1171. '**             are searching for and two integer flags, nullflag% & invalidpath%.
  1172. '**             Function puts up two error messages based on the value of nullflag%, and 
  1173. '**             invalidpath. 
  1174. '** Returns:   Function either returns null or the value of the string.
  1175. '**     
  1176. '*************************************************************************
  1177.   DIM rstring$, rv%, errText$
  1178.  
  1179.    Lot_LocalGetPathFromIni = ""
  1180.    rstring$ = GetIniKeyString(szFile$, szSect$, szKey$)
  1181.  
  1182.    If rstring$ <> "" Then
  1183.       rv% = Lot_CleanPath(rstring$)
  1184.  
  1185.       if rv% <> 0 Then
  1186.      Lot_LocalGetPathFromIni = rstring$
  1187.       elseif invalidpathflag% <> FALSE then
  1188.         Lot_LocalGetPathFromIni = ""
  1189.         EXIT FUNCTION
  1190.      end if 
  1191.  
  1192.       elseif nullflag% <> FALSE then
  1193.      Lot_LocalGetPathFromIni = ""
  1194.      EXIT FUNCTION
  1195.  
  1196.    else
  1197.       Lot_LocalGetPathFromIni = ""
  1198.    end if 
  1199.  
  1200. END FUNCTION
  1201.  
  1202. PUBLIC FUNCTION Lot_GetLotusiniPath(gLotusIniPath$) AS INTEGER
  1203. '** Purpose:    This function builds and sets the global for lotus.ini 
  1204. '**             path 
  1205. '** Author:     MZ
  1206. '** Arguments:  gLotusIniPath$
  1207. '** Returns:    SUCCESS
  1208. '*************************************************************************
  1209.    'Get the path to the lotus.ini
  1210.    gLotusIniPath$ = MakePath( GetWindowsDir(), gLOTUSINI$)
  1211.  
  1212.    Lot_GetLotusiniPath = SUCCESS
  1213.  
  1214. END FUNCTION
  1215. '*************************************************************************
  1216.  
  1217.  
  1218. PUBLIC FUNCTION Lot_GetSharedIniPathName() AS STRING
  1219. '** Purpose:   Builds the path to the datadriver file shared.ini
  1220. '** Author:    MZ
  1221. '** Returns:   the path$ to shared.ini
  1222. '*************************************************************************
  1223. DIM cwd$,gSharedIniFile$
  1224.    'Get the current working directory
  1225.    cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  1226.    gSharedIniFile$ = MakePath(cwd$,gSHAREDINI$)
  1227.    Lot_GetSharedIniPathName=gSharedIniFile$
  1228. END FUNCTION
  1229. '*************************************************************************
  1230.  
  1231.  
  1232. PUBLIC FUNCTION Lot_GetLotusappiniPath(gLotusappIniPath$, gLotusappDir$, gLotusBcfDir$) AS INTEGER
  1233. '** Purpose:    This function builds and sets the global for lotusapp.ini 
  1234. '**             path and directory
  1235. '** Author:     MZ
  1236. '** Arguments:  gLotusappIniPath$, gLotusappDir$,gLotusBcfDir$
  1237. '** Returns:    SUCCESS
  1238. '*************************************************************************
  1239.    'Get the path to lotusapp.ini 
  1240.     gLotusappIniPath$=gLotusappDir$+"lotusapp.ini"
  1241.  
  1242.    'Get the path to lotus.BCF 
  1243.    gLotusBcfDir$ = gLotusappDir$+"datalens\"+ gLOTUSBCF$
  1244.    'print "where this is set gLotusBcfDir",gLotusBcfDir
  1245.  
  1246.    Lot_GetLotusappiniPath = SUCCESS
  1247.  
  1248. END FUNCTION
  1249. '*************************************************************************
  1250.  
  1251. FUNCTION Lot_Save32ShareConfigInInstallIni() AS INTEGER
  1252. '** Purpose:   Saves the components dir and SameDriveForComponent flag  
  1253. '**            into install.ini in the section [Server Configuration of  
  1254. '**            Shared Tools];  This is needed at Node install time
  1255. '** Author:    MZ
  1256. '** Arguments: None
  1257. '** Returns:   SUCCESS
  1258. '*************************************************************************
  1259. DIM networkins$,proddir$,ginstallinifile$,proddrv$
  1260. DIM componentsdir$, componentsdrv$
  1261.  
  1262.    'Identify if I am in server install
  1263.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  1264.    IF Lot_AreShare32ToolsSupported()=1 THEN
  1265.  
  1266.       IF NetworkIns$=gSERVER$ THEN
  1267.  
  1268.          'Built the path to install.ini
  1269.          prodDir$ = Lot_GetInstallDir()
  1270.          gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  1271.  
  1272.          'Log the COMPONENT directory
  1273.          componentsDir$ = GetSymbolValue(SYM_COMPONENTSDIR$)
  1274.          CreateIniKeyValue gInstallIniFile$,_
  1275.             "Server Configuration of Shared Tools",_
  1276.             SYM_COMPONENTSDIR$, _
  1277.             componentsDir$,_
  1278.             cmoOverwrite
  1279.  
  1280.          'Log a flag that tells if the product is in the same drive with components
  1281.          prodDrv$ = LCASE$(Lot_GetVol(prodDir$))
  1282.          componentsDrv$ = LCASE$(Lot_GetVol(componentsDir$))
  1283.          IF prodDrv$ = componentsDrv$ THEN
  1284.         CreateIniKeyValue gInstallIniFile$,_
  1285.                "Server Configuration of Shared Tools",_
  1286.                "SameDriveForComponent",_
  1287.                "1", cmoOverwrite
  1288.          ELSE
  1289.         CreateIniKeyValue gInstallIniFile$,_
  1290.                "Server Configuration of Shared Tools",_
  1291.                "SameDriveForComponent", "0", cmoOverwrite
  1292.          END IF
  1293.  
  1294.  
  1295.       END IF
  1296.    END IF
  1297.  
  1298.    Lot_Save32ShareConfigInInstallIni = SUCCESS
  1299. END FUNCTION
  1300.  
  1301. CONST REGSYSTEMSERVICES = "SystemServices\3.1"
  1302.  
  1303. '*************************************************************************
  1304.  
  1305. SUB Lot_WriteShare32InTheRegistry
  1306. '** Purpose:    This subroutine is to use the 32SHAREDATA array of 
  1307. '**             WIN32SHARED structure and write the registry key if the feature was installed
  1308. '** Author:     MZ
  1309. '** Arguments:  None
  1310. '** Symbols In: 
  1311. '** Returns:    SUCCESS
  1312. '*************************************************************************
  1313. DIM NumOfStrucs%, StrucCount%, KeyWordListLen%, KeyWordCount%, InstalledFlag%
  1314. DIM KWList$, KeyWordName$,Network$,LReturn&, ComponentNameAndVer$, path$, ver$
  1315. DIM DependsOnNameList$,DependsOnVerList$,DependsOnListLen%,DependsOnCount% 
  1316. DIM ListLength%, FileName$, ListName$, Count%, s$, KeyWordList$, i%, kw$
  1317. DIM gInstallIniFile$,cwd$,prodDir$,lenVer%, dirSym$, inidir$
  1318. DIM LocCompPath$, file$, keyvalname1$, keyval1&, keyvalname2$, keyval2&
  1319. DIM CompPath$, UserPath$, key$
  1320.     IF Lot_AreShare32ToolsSupported() <> 1 THEN EXIT SUB
  1321.  
  1322.    'Get how many shared32 sections I have to process
  1323.    NumOfStrucs% = Shared32DataCount
  1324.    IF NumOfStrucs% = 0 THEN EXIT SUB
  1325.  
  1326.    Network$ = GetSymbolValue(SYM_NETWORK$)
  1327.  
  1328.    'Built the path to install.ini
  1329.    IF Network$ = gNODE$ THEN
  1330.       'Get the current working directory
  1331.       'cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  1332.       'gInstallIniFile$ = cwd$+gINSTALLINI$
  1333.        dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  1334.     IF GetListLength(dirSym$) >= 1 THEN
  1335.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  1336.         inidir$ = GetSymbolValue(dirSym$) 
  1337.               gInstallIniFile$ = MakePath(inidir$,"cinstnod.ini")
  1338.     END IF
  1339.    ELSEIF Network$=gSERVER$ OR Network$=gSTANDARD THEN
  1340.       'Get the install directory
  1341.       prodDir$ = Lot_GetInstallDir()
  1342.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  1343.    END IF
  1344.  
  1345.    'print gInstallIniFile$,"gInstallIniFile$"
  1346.  
  1347.       'Write the appropriate entries
  1348. FOR StrucCount% = 1 TO NumOfStrucs%
  1349.     'Make the keyWordListName
  1350.     KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1351.     'print KWList$, "KWList$"
  1352.  
  1353.     'Get the number of the keywords 
  1354.     KeyWordListLen% = GetListLength(KWList$)
  1355.     'print KeyWordListLen%,"KeyWordListLen%"
  1356.      
  1357.     'See if this feature was installed
  1358.     'This will be true if one or more sections are installed    
  1359.     InstalledFlag% = 0
  1360.     IF KeyWordListLen% <> 0 THEN
  1361.     FOR KeyWordCount% = 1 TO KeyWordListLen%
  1362.         KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1363.         keyvalname1$ =    Shared32Data(StrucCount%).RegistrationKey
  1364.         keyvalname2$ =    Shared32Data(StrucCount%).Version 
  1365.         ' JMD: Only write the entry if registry info provided
  1366.         IF keyvalname1$ <> "" AND keyvalname2$ <> "" THEN
  1367.             ComponentNameAndVer$ = keyvalname1$ + "\" + keyvalname2$ 
  1368.             SELECT CASE network$
  1369.             CASE gSTANDARD$ 
  1370.                 IF (FIsKeywordinCopyList (KeyWordName$) = 1) THEN
  1371.                     'Write it in cinstall.ini for uninstall 
  1372.                     'print ComponentNameAndVer$,"ComponentNameAndVer$"
  1373.                     CreateIniKeyValue gInstallIniFile$,_
  1374.                                      "WIN32 Shared Component Information",_
  1375.                                      KeyWordName$, _
  1376.                                      ComponentNameAndVer$,_
  1377.                                      cmoOverwrite
  1378.                     InstalledFlag% = 1
  1379.                 END IF
  1380.                  
  1381.             CASE gNODE$ 
  1382.                 IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 THEN
  1383.                     'Write it in cinstnode.ini for uninstall 
  1384.                     'print ComponentNameAndVer$,"ComponentNameAndVer$"
  1385.                     CreateIniKeyValue gInstallIniFile$,_
  1386.                                      "WIN32 Shared Component Information",_
  1387.                                      KeyWordName$, _
  1388.                                      ComponentNameAndVer$,_
  1389.                                      cmoOverwrite
  1390.                     InstalledFlag% = 1
  1391.                 END IF
  1392.             END SELECT
  1393.         END IF
  1394.     NEXT
  1395.     END IF
  1396.  
  1397.      'Write the registry entries for this feature
  1398.      'only if installed and node or standard
  1399.     IF InstalledFlag% = 0 THEN GOTO DONEXTONE
  1400.     IF network$ <> gSTANDARD$ AND network$ <> gNODE$ THEN GOTO DONEXTONE
  1401.  
  1402.     '**************************
  1403.     '** Registry Key Processing
  1404.     '**************************
  1405.     
  1406.     STATIC SSFlag%
  1407.  
  1408.     IF Shared32Data(StrucCount%).RegistrationKey <> "" THEN
  1409.         'WriteTheComponent Key and Version
  1410.         ComponentNameAndVer$ = Shared32Data(StrucCount%).RegistrationKey+"\"+Shared32Data(StrucCount%).Version 
  1411.         LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1412.               gREGLOTUSCOMP+"\"+ComponentNameAndVer$)
  1413.  
  1414.         '*** TV: Special processing for System Services
  1415.         '*** Used by Lotus Script and Chart    
  1416.         
  1417.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Lotus Script" _
  1418.         OR Shared32Data(StrucCount%).Win32ComponentName =    "Chart" THEN
  1419.  
  1420.             key$ = gREGLOTUSCOMP+ "\" + REGSYSTEMSERVICES
  1421.             LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, key$)
  1422.             ' Write entry for uninstall -- only for Lotus Script so it won't get
  1423.             ' deleted if Chart goes
  1424.             s$    = Shared32Data(StrucCount%).Win32ComponentName 
  1425.             IF s$    = "Lotus Script" AND NOT SSFlag% THEN 
  1426.                 KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1427.                 KeyWordListLen% = GetListLength(KWList$)
  1428.                 IF KeyWordListLen% <> 0 THEN
  1429.                 ' Find the first installed section, use for uninstall object
  1430.                 FOR KeyWordCount% = 1 TO KeyWordListLen%
  1431.                     KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1432.                     IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 AND NOT SSFlag% THEN 
  1433.                         SSFlag% = TRUE
  1434.                         Lot_RegisterObject KeyWordName$, UNIN_CLASS_REGISTRY_HIVE$, _
  1435.                             gHLM$ + "\" + key$
  1436.                     END IF        
  1437.                 NEXT
  1438.                 END IF    
  1439.             END IF    
  1440.             file$ = "LTCHEN21.DLL"
  1441.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1442.                      "INFO", REG_SZ, file$, LEN(file$)+1)
  1443.             file$ = "LTSIN31.DLL"
  1444.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1445.                      "LSI", REG_SZ, file$, LEN(file$)+1)
  1446.             file$ = "LTLRN31.DLL"
  1447.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1448.                      "ADPT", REG_SZ, file$, LEN(file$)+1)
  1449.         END IF
  1450.  
  1451.         '*** TV: Special processing for Chart
  1452.         LocCompPath$=Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1453.         LocCompPath$ = LocCompPath$ + "\"  
  1454.         '** should actually be WIN32SHRCHARTUSER
  1455.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Chart"     THEN
  1456.             Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1457.                  "Style Directory", LocCompPath$, FALSE
  1458.         END IF
  1459.         '*** end special processing
  1460.     
  1461.         '*** TV: Special processing for Mobil Player
  1462.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Mobil Player" THEN
  1463.           LocCompPath$=Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1464.  
  1465.             keyvalname1$ =    "Keep Metafile Size"
  1466.             keyval1& = 00000000
  1467.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1468.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1469.                       keyvalname1$, REG_DWORD,_
  1470.                       keyval1&, 4)
  1471.  
  1472.             keyvalname2$ =    "Dither Grad Fills in Metafiles"
  1473.             keyval2& = 00000001
  1474.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1475.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1476.                       keyvalname2$, REG_DWORD,_
  1477.                       keyval2&, 4)
  1478.             
  1479.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1480.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1481.                      "Working Directory", REG_SZ,_
  1482.                       LocCompPath$, LENBP(LocCompPath$)+1)
  1483.         END IF
  1484.         '*** end special processing for Player
  1485.           
  1486.         '*** TV: Special processing for Spell Data, User and Thesaurus
  1487.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Spell Checker" _
  1488.         OR Shared32Data(StrucCount%).Win32ComponentName =    "Thesaurus" THEN
  1489.             '*** Spell or Thesaurus Data Path
  1490.             IF network$ = gSTANDARD$ THEN
  1491.                 CompPath$ = GetSymbolValue(SYM_COMPONENTSDIR$) + "spell\"
  1492.             ELSE 
  1493.                 '*** has to be node
  1494.                 CompPath$ = GetSymbolValue(SYM_NETCOMPONENT$) + "spell\"
  1495.             END IF
  1496.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1497.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1498.                      "Data Path", REG_SZ,_
  1499.                       CompPath$, LENBP(CompPath$)+1)
  1500.  
  1501.             '*** Spell Multi User Path
  1502.             IF Shared32Data(StrucCount%).Win32ComponentName = "Spell Checker" THEN
  1503.                 UserPath$ = GetSymbolValue(SYM_LOTUSUSERDIR$) + "spell"
  1504.                 Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1505.                      "Multi User Path", UserPath$, TRUE
  1506.             END IF
  1507.         END IF
  1508.         '*** end special processing for Spell
  1509.  
  1510.         'Make entries so that Suite uninstall will not complain about unknown
  1511.         'shared components
  1512.         IF GetSymbolValue(SYM_SINGLESMARTSUITE$) = gSMARTSUITE$ THEN _
  1513.             LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1514.                 gREGLOTUS+_
  1515.                 GetSymbolValue(SYM_REG_PRODUCTNAME$)+"\"+_
  1516.                 GetSymbolValue(SYM_REG_PRODUCTVER$)+"\"+_
  1517.                 "Components\"+_
  1518.                 ComponentNameAndVer$)
  1519.  
  1520.         'Write the help files into the Win95 Regisry
  1521.         '-------------------------------------------
  1522.         'ListName will be blank if no help files exist for feature
  1523.         ListName$ = Shared32Data(StrucCount%).HelpFileNames
  1524.         IF ListName$ = "" GOTO HELPDONE
  1525.  
  1526.         SELECT CASE network$
  1527.         CASE gSERVER$
  1528.                   GOTO HELPDONE
  1529.         CASE gDISTRIBUTION$
  1530.                   GOTO HELPDONE
  1531.         CASE gSTANDARD$ 
  1532.         ' Get the destination directory corresponding to the keyword 
  1533.         ' by finding it from first installed section
  1534.             KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1535.             KeyWordListLen% = GetListLength(KWList$)
  1536.             FOR KeyWordCount% = 1 TO KeyWordListLen%
  1537.                 KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1538.                 s$ =  Lot_GetChapterFromKeyword(KeyWordName$)
  1539.                 IF s$ <> "" THEN s$ = Lot_GetChapterValStr(s$, F_DESTDIRSYM)
  1540.                 IF s$ <> "" THEN s$ = GetSymbolValue(s$)
  1541.                 if s$ <> "" THEN EXIT FOR
  1542.             NEXT    
  1543.         CASE gNODE$ 
  1544.         ' Register the help registry entry under the first product
  1545.             KeyWordName$ = Reg_GetProductAcronym(1) + gTOP$
  1546.         ' For node, assume all help files are in the NETCOMPONENT on the server
  1547.             s$ = GetSymbolValue(SYM_NETCOMPONENT$)
  1548.         END SELECT
  1549.         if s$ = "" THEN GOTO HELPDONE
  1550.  
  1551.         'Add subdirectory under main compnent directory, if any
  1552.         IF Shared32Data(StrucCount%).DestSubdir <> "" THEN _
  1553.             s$ = MakePath(s$, Shared32Data(StrucCount%).DestSubdir)
  1554.         IF RIGHT$(s$, 1) <> "\" THEN  s$ = s$+ "\"
  1555.         ' Traverse the list of help files looking for installed ones
  1556.         IF s$ <> ""    THEN
  1557.             ListLength% = GetListLength(ListName$)
  1558.             FOR Count% = 1 TO ListLength%
  1559.                 FileName$ = GetListItem(ListName$, Count%)
  1560.                 IF DoesFileExist(s$+FileName$,femExists) = 1 THEN _
  1561.                     Lot_RegisterHelpFile KeyWordName$, s$, FileName$
  1562.             NEXT
  1563.         END IF
  1564. HELPDONE:
  1565.  
  1566.         'Writes the Dependents if they exists
  1567.         'but not for node install, since no shared components are on node
  1568.     IF network$ <> gNODE$ THEN
  1569.         'make the DependsOnNameList name 
  1570.         DependsOnNameList$ = "DependsOnNameList"+LTRIM$(STR(StrucCount%))
  1571.         'make the DependsOnVerList name 
  1572.         DependsOnVerList$ = "DependsOnVerList"+LTRIM$(STR(StrucCount%))
  1573.         DependsOnListLen% = 0
  1574.         DependsOnListLen% = GetListLength(DependsOnNameList$)
  1575.         lenVer% =GetListLength(DependsOnVerList$)
  1576.         IF lenVer% = DependsOnListLen%  AND DependsOnListLen% <> 0 AND _
  1577.           GetListItem(DependsOnNameList$,1) <> "" THEN
  1578.             FOR DependsOnCount% = 1 TO DependsOnListLen%
  1579.                 ver$ = GetListItem(DependsOnVerList$,DependsOnCount%)
  1580.                 LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1581.                                 gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%))
  1582.                  'print " before calling Lot_CreateRegKeyValueEx in share32"        
  1583.                 LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1584.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%),_
  1585.                       "Version",_
  1586.                       REG_SZ,_
  1587.                       ver$, _
  1588.                       LEN(ver$)+1)
  1589.                  IF LReturn& <> ERROR_SUCCESS THEN
  1590.                     RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%),"Version",ver$
  1591.                  END IF
  1592.                 'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&        
  1593.             NEXT
  1594.         END IF
  1595.     END IF
  1596.  
  1597.     END IF        ' Registry processing           
  1598.            
  1599.     '**********************
  1600.     '** INI File Processing
  1601.     '**********************
  1602. 'If there is an Ini entry write it
  1603. IF Shared32Data(StrucCount%).IniFileName <> "" AND _
  1604. Shared32Data(StrucCount%).IniSectionName <> "" AND _
  1605. Shared32Data(StrucCount%).IniEntryName <> ""  THEN
  1606.     IF Shared32Data(StrucCount%).DestSubdir <> "" THEN
  1607.         path$ = GetSymbolValue(SYM_COMPONENTSDIR)+Shared32Data(StrucCount%).DestSubdir
  1608.     ELSE
  1609.         path$ = Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1610.     END IF
  1611.     IF Shared32Data(StrucCount%).IniEntryName <> "Common Directory"  THEN
  1612.         CreateIniKeyValue MakePath( GetWindowsDir(), Shared32Data(StrucCount%).IniFileName), _
  1613.          Shared32Data(StrucCount%).IniSectionName, _
  1614.          Shared32Data(StrucCount%).IniEntryName, _
  1615.          path$, cmoOverwrite
  1616.     END IF
  1617. END IF ' end of writing the ini entry
  1618.  
  1619.  
  1620. DONEXTONE:
  1621. NEXT        ' NumOfStrucs
  1622.  
  1623. END SUB
  1624.  
  1625. SUB PopupMappingErrorMsgExit(szPath$)
  1626. '** Purpose:   If components directory drive not mapped or unc path invalid,
  1627. '** popup a dialog and exit
  1628. '**                 
  1629. '** Author:    JMD
  1630. '** Arguments: szPath$    Path 
  1631. '*************************************************************************
  1632.     DIM sz$, i%
  1633.     sz$ = LdString(SID_ERR_DRIVENOTMAPPED)
  1634.     i% = INSTR(sz$, "%")
  1635.     sz$ = MID(sz$, 1, i%-1) + szPath$ + MID(sz$, i%+2, LEN(sz$))
  1636.     i% = DoMsgBox (sz$, LdString(SID_TKT_STD_TITLE) , MB_OK)
  1637.     gEndStatementEncountered% = TRUE
  1638. END SUB
  1639.  
  1640. CONST DRIVE_UNKNOWN     = 0
  1641. CONST DRIVE_NO_ROOT_DIR = 1
  1642. CONST DRIVE_REMOVABLE   = 2
  1643. CONST DRIVE_FIXED       = 3
  1644. CONST DRIVE_REMOTE      = 4
  1645. CONST DRIVE_CDROM       = 5
  1646. CONST DRIVE_RAMDISK     = 6
  1647.  
  1648.  
  1649. PUBLIC FUNCTION IsDriveMapped(szPath$) AS INTEGER
  1650. '** Purpose:    Determine if a drive letter for shared component is currently
  1651. '** mapped or if UNC volume if the directory exists
  1652. '** Author:     JMD
  1653. '** Arguments:  Drive$        Drive letter to test
  1654. '** Returns:    TRUE if mapped
  1655. '*************************************************************************
  1656.     DIM sz$, lDrive$, i%, length%, drivetype%, uncOff&
  1657.  
  1658.     IsDriveMapped = FALSE
  1659.     IF szPath$="" THEN EXIT FUNCTION
  1660.     uncOff& = INSTR(1, szPath$, "\\")
  1661.     ' UNC Volume, check if directory exists
  1662.     IF uncOff > 0 THEN
  1663.         IF DoesDirExist(szPath$) = 1  THEN IsDriveMapped = TRUE
  1664.         EXIT FUNCTION
  1665.     END IF
  1666.     sz$ = LCASE(Lot_ExtractDriveLetter(szPath$)) 
  1667.     GetValidDrivesList("Drives")
  1668.     length% = GetListLength("Drives")
  1669.     FOR i% = 1 TO length%
  1670.         lDrive$ = GetListItem("Drives", i%)
  1671.         'See if it's really there
  1672.         IF LCASE(lDrive$) = sz$ THEN
  1673.             drivetype% = GetDriveType(LEFT(lDrive$,1)+ ":\")
  1674.             IF drivetype% = DRIVE_FIXED THEN IsDriveMapped = TRUE
  1675.             IF drivetype% = DRIVE_REMOTE THEN IsDriveMapped = TRUE
  1676.         END IF
  1677.     NEXT
  1678.     RemoveSymbol "Drives"
  1679. END FUNCTION
  1680.  
  1681. PUBLIC SUB Lot_RegisterHelpFile(szKey$, szDir$, FileName$)
  1682. '** Purpose:    Register help file in Windows registry and record it as an 
  1683. '**                 object in cinstall.ini for uninstall
  1684. '** Author:       JMD
  1685. '** Arguments:    szKey$        Section keyword
  1686. '**                 szDir$        Path to help file
  1687. '**                 FileName$   Help file name
  1688. '*************************************************************************
  1689.  
  1690.     DIM Size%
  1691.     Size% = lenbp(szDir$) + 1
  1692.     Lot_CreateRegKeyValueEx HKEY_LOCAL_MACHINE, gREGWINDOWSHELP, FileName$, _
  1693.         REG_SZ, szDir$, Size%
  1694.     Lot_RegisterObject szKey$, UNIN_CLASS_REGISTRY_VALUE$,_
  1695.         gHLM$ + "\" + gREGWINDOWSHELP + "\" + FileName$
  1696.  
  1697. END SUB
  1698.  
  1699. PUBLIC FUNCTION Lot_RefreshLocalComponentDir () AS INTEGER
  1700. '** Purpose:    Traverses the list of shared 32 bit component sections and if 
  1701. '**                 any are copied to the node it resets the source directory to the
  1702. '**                corresponding value in the "cinstall.ini" file
  1703. '** Author:     JMD
  1704. '** Arguments:  None
  1705. '** Returns:    SUCCESS
  1706. '*************************************************************************
  1707.     DIM Network$, ServerComponentPath$, KeyWordName$
  1708.     DIM ServerUserPath$, Source$, Dest$, Chapter$, ChapterSpec$, s$
  1709.  
  1710.     'Function only valid for node installs
  1711.    Network$ = GetSymbolValue(SYM_NETWORK$)
  1712.    IF Network$ <> gNODE$ THEN EXIT FUNCTION
  1713.     'Read the server locations corresponding to these special symbols
  1714.     ServerComponentPath$ = Lot_GetDestDirValueFromInstallini(SYM_COMPONENTSDIR$)
  1715.     ServerUserPath$ = Lot_GetDestDirValueFromInstallini(SYM_LOTUSUSERDIR$)
  1716.      'If no entry for User Directory on Server, assume same as components
  1717.      IF ServerUserPath$ = "" THEN ServerUserPath$ = ServerComponentPath$ 
  1718.     'Traverse the copy list for shared sections
  1719.     Chapter$ = Lot_GetFirst("", F_SHARE) 
  1720.     WHILE (Chapter$ <> "")
  1721.         KeyWordName$ = Lot_GetChapterValStr(Chapter$, F_KEYWORD)
  1722.         ' If the feature exists on the server, and it wants to be copied now..
  1723.         IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 AND _
  1724.             (CINT(FIsKeywordinCopyList (KeyWordName$)) <> FALSE) THEN
  1725.             s$ = Lot_GetChapterValStr(Chapter$, F_DESTDIRSYM)
  1726.             'Find out if it is a user or component section
  1727.             IF (s$ = SYM_LOTUSUSERDIR$) THEN
  1728.                 Source$ = ServerUserPath$ 
  1729.                 Dest$ = GetSymbolValue(s$)
  1730.             ELSEIF (s$ = SYM_COMPONENTSDIR$) THEN    
  1731.                 Source$ = ServerComponentPath$ 
  1732.                 Dest$ = GetSymbolValue(s$)
  1733.             ELSE    
  1734.                 'Could be WIN, WINSYS, don't reset
  1735.                 GOTO NEXTONE
  1736.             END IF
  1737.             ChapterSpec$ = Lot_GetChapterValStr(Chapter$, F_NOTHING)
  1738.             AddSectionFilesToCopyList ChapterSpec$,Source$,Dest$
  1739.         END IF
  1740. NEXTONE:
  1741.       Chapter$ = Lot_GetNext() 
  1742.     WEND
  1743.    Lot_RefreshLocalComponentDir = SUCCESS
  1744. END FUNCTION
  1745.  
  1746.  
  1747. SUB Lot_CreateAndRegisterUserSubdir(szSubKey$, szValueName$, LocCompPath$, bAppend%)
  1748. '** Purpose:    Create a user registry key for a user path, and verify that the
  1749. '**                path exists; if not, create it
  1750. '** Author:       JMD
  1751. '** Arguments:    
  1752. '**                szSubKey$        Registry key (of HCU)
  1753. '**                szValueName$    Registry value name
  1754. '**                LocCompPath$    Path to register and verify existence
  1755. '**                bAppend%            TRUE if append to existing entry
  1756. '*************************************************************************
  1757.     DIM s$
  1758.     'Make sure ends in trailing backslash
  1759.     LocCompPath$=Lot_TrimEndSlash(LocCompPath$)
  1760.     LocCompPath$= LocCompPath$ + "\"
  1761.     Lot_CreateUserRegistryEntry szSubKey$, szValueName$, LocCompPath$, bAppend%
  1762.     'Create the paths if they don't exist
  1763.     'and register the directory under the first product for uninstall
  1764.     IF DoesDirExist(LocCompPath$) = FALSE THEN 
  1765.         Lot_CreateDirectory(LocCompPath$) 
  1766.        s$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(1) + gTOP$)
  1767.        s$ = Lot_GetChapterValStr(s$, F_KEYWORD)   
  1768.         Lot_RegisterObject s$, UNIN_CLASS_DIRECTORY$, LocCompPath$
  1769.     END IF
  1770. END SUB
  1771.  
  1772. SUB Lot_CreateUserRegistryEntry(szSubKey$, szValueName$, Value$, bAppend%)
  1773. '** Purpose:    Create a user registry key entry
  1774. '** Author:       JMD
  1775. '** Arguments:    
  1776. '**                szSubKey$        Registry key (of HCU)
  1777. '**                szValueName$    Registry value name
  1778. '**                Value$            Registry value 
  1779. '**                bAppend%            TRUE if append to existing entry
  1780. '*************************************************************************
  1781.     DIM gbuf$, nsize&, ret&, NewValue$, i%, s$
  1782.     NewValue$ = Value$
  1783.     IF bAppend% THEN
  1784.         ret& =  Lot_GetRegKeyValueEx(HKEY_CURRENT_USER, szSubKey$, szValueName$, _
  1785.                     0, gbuf$, nsize&) 
  1786.         gbuf$ = NullTrim(gbuf$)
  1787.         'Found the key, parse it and add to it
  1788.         IF ret& = ERROR_SUCCESS THEN
  1789.             DIM VALUELIST LIST AS INTEGER
  1790.             'Make a list of the values already there
  1791.             i% = 1
  1792.             DO
  1793.                 s$ =  Lot_GetNthFieldFromIniString (gbuf$, i%, ";")
  1794.                 s$ =  LCASE(s$)
  1795.                 VALUELIST(s$) = 1
  1796.                 i% = i% + 1
  1797.             LOOP UNTIL s$=""
  1798.             'Add it if it's not already there -- to beginning of list
  1799.             IF ISELEMENT(VALUELIST(LCASE(Value$))) THEN 
  1800.             '  It's already there -- no need to do anything
  1801.                 EXIT SUB
  1802.             ELSE
  1803.                 NewValue = Value$ + ";" + gbuf$
  1804.             END IF
  1805.         END IF
  1806.     END IF
  1807.     ret& = Lot_CreateRegKeyValueEx(HKEY_CURRENT_USER,_
  1808.                       szSubKey$,  szValueName, REG_SZ, NewValue$, LENBP(NewValue$)+1)
  1809.     IF ret& <> ERROR_SUCCESS THEN _
  1810.         RegErrorMsg SID_ERR_REG_GENERIC, gHCU$+"\"+szSubKey$,szValueName,NewValue$
  1811. END SUB
  1812.